import StropheAll from '../../strophe.js'
    ;
(function () {
    'use strict';

    var _utils = require('./utils').utils;
    var Message = function (type, id) {
        if (!this instanceof Message) {
            return new Message(type);
        }

        this._msg = {};

        if (typeof Message[type] === 'function') {
            Message[type].prototype.setGroup = this.setGroup;
            this._msg = new Message[type](id);
        }
        return this._msg;
    }
    Message.prototype.setGroup = function (group) {
        this.body.group = group;
    }


    /*
     * text message
     */
    Message.txt = function (id) {
        this.id = id;
        this.type = 'txt';
        this.body = {};
    };
    Message.txt.prototype.set = function (opt) {
        this.value = opt.msg;
        this.body = {
            id: this.id
            , to: opt.to
            , msg: this.value
            , type: this.type
            , roomType: opt.roomType
            , ext: opt.ext || {}
            , success: opt.success
            , fail: opt.fail
        };

        !opt.roomType && delete this.body.roomType;

    };

    /*
     * cmd message
     */
    Message.cmd = function (id) {
        this.id = id;
        this.type = 'cmd';
        this.body = {};
    };
    Message.cmd.prototype.set = function (opt) {
        this.value = '';

        this.body = {
            to: opt.to
            , action: opt.action
            , msg: this.value
            , type: this.type
            , roomType: opt.roomType
            , ext: opt.ext || {}
        };
        !opt.roomType && delete this.body.roomType;
    };

    /*
     * loc message
     */
    Message.location = function (id) {
        this.id = id;
        this.type = 'loc';
        this.body = {};
    };
    Message.location.prototype.set = function (opt) {
        this.body = {
            to: opt.to
            , type: this.type
            , roomType: opt.roomType
            , addr: opt.addr
            , lat: opt.lat
            , lng: opt.lng
            , ext: opt.ext || {}
        };
    };

    /*
     * img message
     */
    Message.img = function (id) {
        this.id = id;
        this.type = 'img';
        this.body = {};
    };
    Message.img.prototype.set = function (opt) {
        // opt.file = opt.file || _utils.getFileUrl(opt.fileInputId);
        ////console.log(opt)
        this.value = opt.file;
        this.body = {
            id: this.id,
            file: this.value,
            apiUrl: opt.apiUrl,
            to: opt.to,
            type: this.type,
            ext: opt.ext || {},
            roomType: opt.roomType,
            onFileUploadError: opt.onFileUploadError,
            onFileUploadComplete: opt.onFileUploadComplete,
            success: opt.success,
            fail: opt.fail,
            flashUpload: opt.flashUpload,
            width: opt.width,
            height: opt.height,
            body: opt.body
        };
        !opt.roomType && delete this.body.roomType;
    };

    /*
     * audio message
     */
    Message.audio = function (id) {
        this.id = id;
        this.type = 'audio';
        this.body = {};
    };
    Message.audio.prototype.set = function (opt) {
        opt.file = opt.file || _utils.getFileUrl(opt.fileInputId);

        this.value = opt.file;
        this.filename = opt.filename || this.value.filename;

        this.body = {
            id: this.id
            , file: this.value
            , filename: this.filename
            , apiUrl: opt.apiUrl
            , to: opt.to
            , type: this.type
            , ext: opt.ext || {}
            , length: opt.length || 0
            , roomType: opt.roomType
            , file_length: opt.file_length
            , onFileUploadError: opt.onFileUploadError
            , onFileUploadComplete: opt.onFileUploadComplete
            , success: opt.success
            , fail: opt.fail
            , flashUpload: opt.flashUpload
            , body: opt.body
        };
        !opt.roomType && delete this.body.roomType;
    };

    /*
     * file message
     */
    Message.file = function (id) {
        this.id = id;
        this.type = 'file';
        this.body = {};
    };
    Message.file.prototype.set = function (opt) {
        opt.file = opt.file || _utils.getFileUrl(opt.fileInputId);

        this.value = opt.file;
        this.filename = opt.filename || this.value.filename;

        this.body = {
            id: this.id
            , file: this.value
            , filename: this.filename
            , apiUrl: opt.apiUrl
            , to: opt.to
            , type: this.type
            , ext: opt.ext || {}
            , roomType: opt.roomType
            , onFileUploadError: opt.onFileUploadError
            , onFileUploadComplete: opt.onFileUploadComplete
            , success: opt.success
            , fail: opt.fail
            , flashUpload: opt.flashUpload
            , body: opt.body
        };
        !opt.roomType && delete this.body.roomType;
    };

    /*
     * video message
     */
    Message.video = function (id) {

    };
    Message.video.prototype.set = function (opt) {

    };

    var _Message = function (message) {

        if (!this instanceof _Message) {
            return new _Message(message, conn);
        }

        this.msg = message;
    }

    _Message.prototype.send = function (conn) {
        var me = this;
        ////console.log(this)           // 消息对象
        var _send = function (message) {

            message.ext = message.ext || {};
            message.ext.weichat = message.ext.weichat || {};
            message.ext.weichat.originType = message.ext.weichat.originType || 'webim';
            // //console.log('message',message)     msg对象
            var json = {
                from: conn.context.userId || ''
                , to: message.to
                , bodies: [message.body]
                , ext: message.ext || {}
            };

            var jsonstr = _utils.stringify(json);
            var dom = StropheAll.$msg({
                type: message.group || 'chat'
                , to: message.toJid
                , id: message.id
                , xmlns: 'jabber:client'
            }).c('body').t(jsonstr);
            //console.log("dommmmmmmm",dom)
            if (message.roomType) {
                dom.up().c('roomtype', {xmlns: 'easemob:x:roomtype', type: 'chatroom'});
            }

            setTimeout(function () {
                if (typeof _msgHash !== 'undefined' && _msgHash[message.id]) {
                    _msgHash[message.id].msg.fail instanceof Function
                    && _msgHash[message.id].msg.fail(message.id);
                }
            }, 60000);
            conn.sendCommand(dom.tree(), message.id);
        }


        if (me.msg.file) {
            if (me.msg.body && me.msg.body.url) {// Only send msg
                _send(me.msg);
                return;
            }
            var _tmpComplete = me.msg.onFileUploadComplete;
            var _complete = function (data) {

                if (data.entities[0]['file-metadata']) {
                    var file_len = data.entities[0]['file-metadata']['content-length'];
                    me.msg.file_length = file_len;
                    me.msg.filetype = data.entities[0]['file-metadata']['content-type'];
                    if (file_len > 204800) {
                        me.msg.thumbnail = true;
                    }
                }

                me.msg.body = {
                    type: me.msg.type || 'file'
                    , url: data.uri + '/' + data.entities[0]['uuid']
                    , secret: data.entities[0]['share-secret']
                    , filename: me.msg.file.filename || me.msg.filename
                    , size: {
                        width: me.msg.width || 0
                        , height: me.msg.height || 0
                    }
                    , length: me.msg.length || 0
                    , file_length: me.msg.file_length || 0
                    , filetype: me.msg.filetype
                }

                _send(me.msg);
                _tmpComplete instanceof Function && _tmpComplete(data, me.msg.id);
            };

            me.msg.onFileUploadComplete = _complete;
            _utils.uploadFile.call(conn, me.msg);
        } else {
            if (me.msg.type === 'img') {                                             //  添加img判断规则   wjy
                _send(me.msg);
            } else {
                me.msg.body = {
                    type: me.msg.type === 'chat' ? 'txt' : me.msg.type
                    , msg: me.msg.msg
                };
                if (me.msg.type === 'cmd') {
                    me.msg.body.action = me.msg.action;
                } else if (me.msg.type === 'loc') {
                    me.msg.body.addr = me.msg.addr;
                    me.msg.body.lat = me.msg.lat;
                    me.msg.body.lng = me.msg.lng;
                }
                _send(me.msg);
                //console.log('ooooooooooooooooooo')
            }

        }
    };

    exports._msg = _Message;
    exports.message = Message;
}());
